
local AOI_ACTION_TYPE	= AOI_ACTION_TYPE
local printx = debug.printx

clsSceneObj = ALL_CLASS.clsCoreObj:Inherit("clsSceneObj")

function __init__(self)
    self.clsSceneObj:RegTmpVar("Uid")
	self.clsSceneObj:RegTmpVar("X") -- 场景内的坐标X
	self.clsSceneObj:RegTmpVar("Y") -- 场景内的坐标Y
	self.clsSceneObj:RegTmpVar("Z") -- 场景内的坐标Z，保存高度
    self.clsSceneObj:RegTmpVar("SceneID")  -- 场景配置编号
	self.clsSceneObj:RegTmpVar("SceneUid") -- 所在场景Id
    self.clsSceneObj:RegTmpVar("Scene") -- 所在场景
end

-- obj的初始化函数，由管理者负责调用
function clsSceneObj:OnCreate(oci)
	Super(clsSceneObj).OnCreate(self, oci)

	-- 场景aoi触发器
	self.m_AoiNodeEntity = nil
	self.m_AoiNodeArea = nil
    self.m_AoiInScene = nil
end

function clsSceneObj:ToString()
	return string.format("Uid=%s, SceneID=%d, SceneUid=%d", self:GetUid() or 0,
		self:GetSceneID() or 0, self:GetSceneUid() or 0)
end

-- obj的析构函数，由管理者负责调用。这里有资源释放逻辑，不调用可能会泄漏。子类不能虚继承此函数！！！
function clsSceneObj:OnDestroy()
    self.m_Destroyed = true
	if self.m_AoiNodeMgr then
		self:ReqAOI(AOI_ACTION_TYPE.Destroy)
	end
	if self:GetScene() then
		self:LeaveScene()
	end
	Super(clsSceneObj).OnDestroy(self)
end

function clsSceneObj:OnGoto(x, y)

end

function clsSceneObj:OnEnterScene(pos, scene)
	self:SetScene(scene)
    self:SetSceneID(scene:GetSceneId())
	self:SetSceneUid(scene:GetSceneUid())
	self:SetX(pos[1])
	self:SetY(pos[2])
end

function clsSceneObj:OnLeaveScene(scene)
	self:SetScene(nil)
end

-- 获得场景中的坐标
function clsSceneObj:GetPos()
	return self:GetX(), self:GetY()
end

-- 设定obj在场景中的坐标,这个操作会触发场景的aoi事件
function clsSceneObj:SetPos(x, y)
	local scene = self:GetScene()
	if not scene then return end

	scene:OnObjGoto({x, y}, self)
end

-- obj在场景中的瞬移操作，多用于坐标的强制修正，继承的子类可以在这里进行坐标同步
function clsSceneObj:Goto(x, y)
	if not x or not y then return false end
	self:SetPos(x, y)
	return true
end

function clsSceneObj:GotoScene(sceneID, pos, sceneUid)
	ALLSCENE:GotoScene(self, sceneID, pos, sceneUid)
end

-- TODO: 将Climbing这个参数改到user下
-- 将自己添加入场景,需传入场景实例
function clsSceneObj:EnterScene(pos, targetScene)
	local x, y
	if pos then
		x, y= table.unpack(pos)
	end
	
	local curScene = self:GetScene()
	if curScene then
		if curScene == targetScene then
			self:Goto(x, y)
		else
			-- 场景切换
			self:LeaveScene()
			self:RealDoEnterScene(pos, targetScene)
		end
	else
		self:RealDoEnterScene(pos, targetScene)
	end
end

function clsSceneObj:RealDoEnterScene(pos, targetScene)
	targetScene:OnObjEnter(pos, self)
end

-- 离开当前场景,这个操作不会清空玩家的aoi相关信息
function clsSceneObj:LeaveScene()
	local curScene = self:GetScene()
	curScene:OnObjLeave(self)
end


----------------------------------------------------------------
-- 场景obj的aoi特性相关操作
---------------------------------------
function clsSceneObj:GetAoiMask()
	error("必须重载GetAoiMask接口来提供mask/imask信息")
end

-- 有target进入当前target的焦点范围时回调，供子类继承实现其他功能
function clsSceneObj:OnObjEnter(target)
end

-- 有target离开当前target的焦点范围时回调，供子类继承实现其他功能
function clsSceneObj:OnObjLeave(target)
end